package com.pic.mgt.syushin;

import java.io.File;

import com.pic.mgt.log.IgxLog;
import com.pic.mgt.monitor.backup.MessagePhysicalBackup;
import com.pic.mgt.syushin.unit.BucketOkSyushinMessageUnit;
import com.pic.mgt.unit.Message;
import com.pic.mgt.unit.Unit;
import com.pic.mgt.unit.operation.UnitOperationException;

public final class SyushinMessagePhysicalBackup extends MessagePhysicalBackup {
	
	private String syushinMessageBucketBackupPathStr;
	
	@Override
	/*
	 * 覆寫 MessagePhysicalBackup 的 backupUnit()。目的是在集信的 Message 有多一種較特殊的
	 * Bucket Message。需要特別處理。所以覆寫在方法裡面判斷若為 Bucket 的 Message 就做另外
	 * 的備份動作，若為一般的 Message 還是交由  MessagePhysicalBackup. backupUnit() 來做。
	 */
	public boolean backupUnit(Unit unit) {
		
		if (!BucketOkSyushinMessageUnit.class.isInstance(unit)) {
			//  若是一般的 Message，則還是交由 super 來做
			return super.backupUnit(unit);
		}
		
		
		// ------------ 以下做 Syushin Bucket Message 的備份 -------------------
		
		
		Message message = (Message)unit;
		
		boolean hasCompleteAction = true;
		
		// 取得 Bucket Message 正確的備份路徑 (包含年，月，日)
		File bucketMessageBackupFolder =
			super.getPathWithNowDate(this.syushinMessageBucketBackupPathStr);
		
		// 開始備份實體檔案
		
		// 備份 trans ok 確認檔
		try {
			// ********************** Log **********************
			if (IgxLog.messageLog.isDebugMode()) {
				IgxLog.messageLog.debug(this,
						"Backuping bucket message '{}' confirmation file '{}'.",
						message.getUnitName(),
						message.getConfirmationFilename());
			}
			// ********************** Log **********************
			
			super.simpleMessageUnitOperation.copyConfirmationFile(
					message, bucketMessageBackupFolder);
			
			// ********************** Log **********************
			if (IgxLog.messageLog.isDebugMode()) {
				IgxLog.messageLog.debug(this,
						"Backuping bucket message '{}' confirmation file '{}' completed.",
						message.getUnitName(),
						message.getConfirmationFilename());
			}
			// ********************** Log **********************
		} catch (UnitOperationException e) {
			hasCompleteAction = false;
			
			// ********************** Log **********************
			IgxLog.messageLog.error(this,
					"SUDA-309 Backuping bucket message '{}' confirmation file '{}' failed.",
					message.getUnitName(),
					message.getConfirmationFilename());
			// ********************** Log **********************
		}
		
		return hasCompleteAction;
	}
	
	// --- getter and setter ---
	
	public void setSyushinMessageBucketBackupPathStr(
			String syushinMessageBucketBackupPathStr) {
		this.syushinMessageBucketBackupPathStr = syushinMessageBucketBackupPathStr;
	}

}
